package com.bdqn.web;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.bdqn.base.Global;
import com.bdqn.base.R;
import com.bdqn.base.logger.WebLogger;
import com.bdqn.base.util.JWTUtil;
import com.bdqn.pojo.User;
import com.bdqn.service.AuthService;
import com.bdqn.util.CoderUtil;
import com.bdqn.util.RandomUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

/**
 * 认证授权模块
 *
 * @author lilibo
 * @date 2021/10/01
 */
@Api(tags = "认证授权模块接口")
@RestController
@RequestMapping("/auth")
public class AuthController {

    @Resource
    private AuthService authService;

    /**
     * 用户注册
     *
     * @param user 用户注册信息
     * @return 用户对象
     */
    @ApiOperation("用户注册")
    @WebLogger("用户注册")
    @PostMapping("/register")
    public R<User> register(@RequestBody User user) {
        // 生成一个随机盐值
        String salt = RandomUtil.generateRandom(4);
        // 加密规则（获取密码字节数对3取模加3）
        int length = (user.getPassword() + salt).getBytes().length % 3 + 3;
        String enPassword = CoderUtil.encryptMD5(user.getPassword() + salt, length);
        // 创建用户对象
        User newUser = new User();
        newUser.setName(user.getName());
        newUser.setNickname(user.getNickname());
        newUser.setPassword(enPassword); // 加密后的密码
        newUser.setSalt(salt); // 设置盐值
        boolean save = authService.save(newUser);
        if (save) {
            return R.success("注册成功", newUser);
        } else {
            return R.failure("注册失败");
        }
    }

    /**
     * 用户登录
     *
     * @param user 用户JSON对象
     * @return 登录成功返回Token
     */
    @ApiOperation("用户登录")
    @WebLogger("用户登录")
    @PostMapping("/login")
    public R<String> login(@RequestBody User user) {
        QueryWrapper<User> qw = new QueryWrapper<>();
        qw.eq("name", user.getName());
        User authUser = authService.getOne(qw);
        if (authUser == null) {
            return R.failure("用户名或密码错误");
        }
        // 获取注册时保持的盐值
        String salt = authUser.getSalt();
        // 加密规则（获取密码字节数对3取模加3）
        int length = (user.getPassword() + salt).getBytes().length % 3 + 3;
        String enPassword = CoderUtil.encryptMD5(user.getPassword() + salt, length);
        if (!enPassword.equals(authUser.getPassword())) {
            return R.failure("用户名或密码错误");
        }
        Map<String, Object> params = new HashMap<>();
        params.put(Global.JWT_SUBJECT, authUser.getId());
        // 产生一个JWT的Token
        String token = JWTUtil.createJWT(Global.KEY_TERM, params);
        // 将Token下发给客户端
        return R.success(token);
    }

    /**
     * 验证Token
     *
     * @param token 用于验证的令牌
     * @return
     */
    @ApiOperation("验证Token")
    @WebLogger("验证Token")
    @PostMapping("/verify")
    public R verifyAuthToken(@RequestBody String token) {
        if (token == null) {
            return R.failure(false);
        }
        boolean verify = JWTUtil.verifyJWT(token);
        if (verify) {
            return R.success(true);
        } else {
            return R.failure(false);
        }

    }

}
